#include "FenetreObservateur.h"

FenetreObservateur::FenetreObservateur()
{
    // icon de l'application.
    QIcon *ico = new QIcon(":/pic/seco");
    setWindowIcon(*ico);
    setWindowTitle("Labo de langue - Observateur");

    // Création de la barre de menu.
    menuFichier = menuBar()->addMenu("&Fichier");
    // Action exit.
    QAction *actionQuitter = menuFichier->addAction("&Quitter");
    actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
    actionQuitter->setIcon(QIcon(":/pic/door"));
    actionQuitter->setStatusTip("Quitte le programme");
    QObject::connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));

    // Création de la barre d'outils.
    toolBarFichier = addToolBar("ToolBar");
    toolBarFichier->setFloatable(false);
    toolBarFichier->addAction(actionQuitter);
    toolBarFichier->addSeparator();

    // Création de la barre d'état.
    barreEtat = statusBar();

    // Création du widget Principal.
    mainWidget = new QWidget(this);


    //   Création du menu de gauche.
    widgetGauche = new QWidget(mainWidget);
    layoutGauche =  new QVBoxLayout(widgetGauche);
    /* Liste etu */
    ListeEtudiantLabel = new QLabel("Liste des étudiants dans la salle",widgetGauche);
    ListeEtudiantQTreeView = new QTreeView(widgetGauche);
    modeleListeEtu = new QStringListModel(widgetGauche);
    ListeEtudiantQTreeView->setModel(modeleListeEtu);
    ListeEtudiantQTreeView->header()->hide();
    ListeEtudiantQTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    layoutGauche->addWidget(ListeEtudiantLabel);
    layoutGauche->addWidget(ListeEtudiantQTreeView);
    /*Zone activite etu*/
    ActiviteDesEtudiantsLabel = new QLabel("Actions des étudiants",widgetGauche);
    console = new QTextEdit(widgetGauche);
    layoutGauche->addWidget(ActiviteDesEtudiantsLabel);
    layoutGauche->addWidget(console);
    /*Zone de chat etu*/
    widgetBasGauche = new QWidget(widgetGauche);
    layoutBasGauche = new QGridLayout(widgetBasGauche);
    BoutonEnvoyerMessage = new QPushButton("Send",widgetBasGauche);
    ZoneChatAvecEtuLabel = new QLabel("MODE ASSISTANT",widgetBasGauche);
    ZoneDeChatTextEdit = new QTextEdit("Devenez Assistant en double clickant sur un etudiant, vous pourrez chattez avec lui");
    ZoneDeChatTextEdit->setReadOnly(true);;
    ZoneDechatLineEdit = new QLineEdit("Chattez Ici",widgetBasGauche);
    layoutBasGauche->addWidget(ZoneChatAvecEtuLabel);
    layoutBasGauche->addWidget(ZoneDeChatTextEdit,1,0,1,2);
    layoutBasGauche->addWidget(ZoneDechatLineEdit,2,0);
    layoutBasGauche->addWidget(BoutonEnvoyerMessage,2,1);
    layoutGauche->addWidget(widgetBasGauche);

    // Création du menu de droite.
    widgetDroit = new QWidget(mainWidget);
    widgetDroit->setFixedWidth(300);
    layoutDroit =  new QVBoxLayout(widgetDroit);

    layoutConnexion = new QFormLayout(widgetDroit);
    etat = new QLabel(widgetDroit);
    QFont font("System", 14);
    etat->setFont(font);
    etat->setText("<font color=#C60003>Déconnecté</font>");
    ip = new QLineEdit(widgetDroit);
    ip->setText("127.0.0.1");
    port = new QLineEdit(widgetDroit);
    port->setText("8888");
    nick = new QLineEdit(widgetDroit);
    layoutConnexion->setSpacing(5);
    layoutConnexion->addRow("Etat", etat);
    layoutConnexion->addRow("&Ip", ip);
    layoutConnexion->addRow("P&ort", port);
    layoutConnexion->addRow("&Pseudo", nick);

    boutonConnexion = new QPushButton("Connexion", widgetDroit);
    boutonConnexion->setStatusTip("Connexion au serveur");
    boutonConnexion->setToolTip("Se connecter");
    listeSalles = new QTreeView(widgetDroit);
    listeSalles->header()->hide();
    listeSalles->setEditTriggers(QAbstractItemView::NoEditTriggers);
    listeActivites = new QTreeView(widgetDroit);
    listeActivites->header()->hide();
    listeActivites->setEditTriggers(QAbstractItemView::NoEditTriggers);
    console2 = new QTextEdit(widgetDroit);
    console2->setReadOnly(true);
    nomSalle = new QLineEdit("Nom de la salle",widgetDroit);
    Activite1 = new QCheckBox("QCM",widgetDroit);
    Activite2 = new QCheckBox("Q2",widgetDroit);
    Activite3 = new QCheckBox("Q3",widgetDroit);
    Activite4 = new QCheckBox("Q4",widgetDroit);

    NouvelleSalle = new QPushButton("Creer votre salle",widgetDroit);

    layoutDroit->addLayout(layoutConnexion);
    layoutDroit->addWidget(boutonConnexion);
    labelListeSalles = new QLabel("Liste des salles:");

    layoutDroit->addWidget(labelListeSalles);
    layoutDroit->addWidget(listeSalles);
    ListeDesActivitesDansLaSalle = new QLabel("Activites",widgetDroit);
    layoutDroit->addWidget(ListeDesActivitesDansLaSalle);
    layoutDroit->addWidget(listeActivites);

    //layoutDroit->addWidget(new QLabel("Ajouter une activite:", widgetDroit));
    layoutDroit->addWidget(nomSalle);
    layoutDroit->addWidget(Activite1);


    layoutDroit->addWidget(Activite2);
    layoutDroit->addWidget(Activite3);
    layoutDroit->addWidget(Activite4);
    layoutDroit->addWidget(NouvelleSalle);
    layoutDroit->addWidget(console2);

    // Création du layout Principal.
    mainLayout = new QHBoxLayout;
    mainWidget->setLayout(mainLayout);
    mainLayout->addWidget(widgetGauche);
    mainLayout->addWidget(widgetDroit);

    setCentralWidget(mainWidget);
    nick->setFocus();

    observateurBase = new ObservateurBase(this);

    connect(boutonConnexion, SIGNAL(clicked()), this, SLOT(onClick_connexion()));
    connect(observateurBase, SIGNAL(estDeconnecte(QString)), this, SLOT(etatDeconnecte(QString)));
    connect(observateurBase, SIGNAL(estConnecte()), this, SLOT(etatConnecte()));
    connect(observateurBase, SIGNAL(sallesRecues(QStringList)), this, SLOT(remplirListeSalles(QStringList)));
    connect(observateurBase, SIGNAL(activitesRecues(QStringList)), this, SLOT(remplirListeActivites(QStringList)));
    connect(listeSalles, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onClick_salle(QModelIndex)));
    connect(NouvelleSalle,SIGNAL(clicked()),this,SLOT(onClick_AjouterSalle()));
    connect(observateurBase, SIGNAL(etudiants_recus(QString)),this,SLOT(modifierListeEtudiant(QString)));
    connect(observateurBase,SIGNAL(connecteasalle()),this,SLOT(connecteasalle()));
    connect(observateurBase, SIGNAL(message_act(QString)), this, SLOT(connecteaactivite(QString)));
    connect(ListeEtudiantQTreeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onClick_listeEtu(QModelIndex)));
    connect(BoutonEnvoyerMessage, SIGNAL(clicked()), this, SLOT(onClick_EnvoyerMessageZoneChat()));
    affiche(0);
}

string FenetreObservateur::getLogin()
{
    return nick->text().toStdString();
}

void FenetreObservateur::ecrireConsole2(string message)
{
    console2->append(QString::fromStdString(message));
}

void FenetreObservateur::ecrireConsole2(QString message)
{
    console2->append(message);
}

void FenetreObservateur::ecrireConsole2(const char *message)
{
    console2->append(message);
}

void FenetreObservateur::onClick_connexion()
{
    affiche(true);
    observateurBase->ouvrirSocket(ip->text().toStdString().c_str(), port->text().toStdString().c_str());
}

void FenetreObservateur::onClick_salle(QModelIndex index)
{
    QVariant elementSelectionne = modeleListeSalles->data(index, Qt::DisplayRole);
    string idSalle = elementSelectionne.toString().toStdString();
    observateurBase->ecrireMessage(OBS_CHOIX, idSalle);
    QString texte = "Liste des activites dans la salle : ";
    texte.append(QString::fromStdString(idSalle));
    ListeDesActivitesDansLaSalle->setText(texte);
}

void FenetreObservateur::etatConnecte()
{
    etat->setText("<font color=#04B91C>Connecté</font>");
    boutonConnexion->setText("Déconnexion");
    ip->setDisabled(true);
    port->setDisabled(true);
    nick->setDisabled(true);
    affiche(1);
}

void FenetreObservateur::etatDeconnecte(QString cause)
{
    etat->setText("<font color=#C60003>Déconnecté</font>");
    boutonConnexion->setText("Connexion");
    ip->setDisabled(false);
    port->setDisabled(false);
    nick->setDisabled(false);
    affiche(0);
    ecrireConsole2("Déconnecté du serveur (" + cause + ").");
}

void FenetreObservateur::remplirListeSalles(QStringList liste)
{
    modeleListeSalles = new QStringListModel(liste, widgetDroit);
    listeSalles->setModel(modeleListeSalles);
}

void FenetreObservateur::remplirListeActivites(QStringList liste)
{
    modeleListeActivites = new QStringListModel(liste,widgetDroit);
    listeActivites->setModel(modeleListeActivites);
    for(int i = 0 ; i < liste.count() ; ++i){
        if(liste.at(i) == Activite1->text())
            Activite1->setChecked(true);
        if(liste.at(i) == Activite2->text())
            Activite2->setChecked(true);
        if(liste.at(i) == Activite3->text())
            Activite3->setChecked(true);
        if(liste.at(i) == Activite4->text())
            Activite4->setChecked(true);
    }
    affiche(2);
}
void FenetreObservateur::affiche(int what)
{
    //0 : Tout effacer sauf la partie connection
    //1 : Afficher La partie Salle + creer salle
    //2 : Afficher Liste Etu + Zone Activite
    //3 : Afficher Zone de chat.
    switch (what)
    {
    case 0 :
        {
            Activite1->setCheckable(false);
            Activite2->setCheckable(false);
            Activite3->setCheckable(false);
            Activite4->setCheckable(false);
            nomSalle->setEnabled(false);
            listeActivites->setEnabled(false);
            NouvelleSalle->setEnabled(false);
            widgetGauche->setEnabled(false);
            break;
        }
    case 1 :
        {
            Activite1->setCheckable(true);
            Activite2->setCheckable(true);
            Activite3->setCheckable(true);
            Activite4->setCheckable(true);
            nomSalle->setEnabled(true);
            NouvelleSalle->setEnabled(true);
            break;
        }
    case 2 :
        {
    labelListeSalles->setVisible(false);
            listeSalles->setVisible(false);
            Activite1->setVisible(false);
            Activite2->setVisible(false);
            Activite3->setVisible(false);
            Activite4->setVisible(false);
            NouvelleSalle->setVisible(false);
            nomSalle->setVisible(false);
            widgetGauche->setEnabled(true);
            widgetBasGauche->setEnabled(false);
            break;
        }
    case 3 :
        widgetBasGauche->setEnabled(true);
        break;
    }
}

void FenetreObservateur::onClick_AjouterSalle()
{
    observateurBase->ecrireMessage(OBS_CHOIX, nomSalle->text().toStdString());
    QString texte = "Activites dans votre salle : ";
    texte.append(nomSalle->text());
    ListeDesActivitesDansLaSalle->setText(texte);
}

QStringList FenetreObservateur::listeAct()
{
    QStringList liste;
    if (Activite1->isChecked()) liste << Activite1->text();
    if (Activite2->isChecked()) liste << Activite2->text();
    if (Activite3->isChecked()) liste << Activite3->text();
    if (Activite4->isChecked()) liste << Activite4->text();
    return liste;
}

void FenetreObservateur::activerAssistant()
{
    widgetBasGauche->setEnabled(true);
}

void FenetreObservateur::desactiverAssistant()
{
    observateurBase->ecrireMessage(AST_LOGOUT);
    widgetGauche->setDisabled(true);
}

void FenetreObservateur::ecrireMessageChat(QString message)
{
    ZoneDeChatTextEdit->append(message);
}

void FenetreObservateur::onClick_EnvoyerMessageZoneChat()
{
    ecrireMessageChat(nick->text() + " : " + ZoneDechatLineEdit->text());
    observateurBase->ecrireMessage(AST_ETUD_MSG, nick->text().toStdString() + " : " + ZoneDechatLineEdit->text().toStdString());
    ZoneDechatLineEdit->clear();
}

void FenetreObservateur::modifierListeEtudiant(QString etu)
{
    int num_lignes = modeleListeEtu->rowCount();
    modeleListeEtu->insertRow(num_lignes);
    modeleListeEtu->setData(modeleListeEtu->index(num_lignes),etu);
}

void FenetreObservateur::connecteasalle(){
    ListeDesActivitesDansLaSalle->setText("Vous etes connecte a une salle");
    affiche(2);
    listeActivites->setVisible(false);
}

void FenetreObservateur::connecteaactivite(QString string)
{
    console->append(string);
}

void FenetreObservateur::onClick_listeEtu(QModelIndex index)
{
    QVariant elementSelectionne = modeleListeEtu->data(index, Qt::DisplayRole);
    string loginEtu = elementSelectionne.toString().toStdString();
    observateurBase->ecrireMessage(AST_LOGOUT);
    observateurBase->ecrireMessage(AST_LOGIN, nick->text().toStdString(), loginEtu);
    activerAssistant();
}
